import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestRegressor
from scipy.optimize import minimize
import matplotlib.pyplot as plt

# 读取数据
data = pd.read_excel('合并数据集.xlsx')
data = data.iloc[1:]  # 删除第一行
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用SimHei字体
plt.rcParams['axes.unicode_minus'] = False  # 正确显示负号
# 提取特征和目标#比赛结束前最后一天售后群发布无水印可视化结果+无标注代码【可直接提交】为了防止倒卖， 论文写作过程中遗留数个致命问题，无关代码，该问题解决方式仅在官网授权售后群答疑，盗卖方式购买资料不提供答疑，感谢理解2024年研赛资料助攻购买链接+说明https://docs.qq.com/doc/p/e03d6bffc00b392932b7dc1fbcf746ef9b086a8a
material = pd.Categorical(data.iloc[:, 0])  # 材料
temperature = data.iloc[:, 1]  # 温度
frequency = data.iloc[:, 2]  # 频率
core_loss = data.iloc[:, 3]  # 磁芯损耗
waveform = pd.Categorical(data.iloc[:, 4])  # 励磁波形
magnetic_density = data.iloc[:, 5:].values  # 磁通密度数据

# 磁通密度峰值
Bm = np.max(magnetic_density, axis=1)

# 构建输入特征矩阵
X = np.column_stack((material.codes, temperature, frequency, waveform.codes, Bm))

# 构建随机森林模型
model = RandomForestRegressor(n_estimators=100, random_state=1, oob_score=True)
model.fit(X, core_loss)

# 计算传输磁能
transmission_energy_values = frequency * Bm

# 计算均值和标准差
mean_core_loss = np.mean(core_loss)
std_core_loss = np.std(core_loss)
mean_trans_energy = np.mean(transmission_energy_values)
std_trans_energy = np.std(transmission_energy_values)

# 计算变异系数
cv_core_loss = std_core_loss / mean_core_loss
cv_trans_energy = std_trans_energy / mean_trans_energy

# 权重计算
w1 = 1 / cv_core_loss
w2 = 1 / cv_trans_energy

# 归一化权重
w_sum = w1 + w2
w1 /= w_sum
w2 /= w_sum
#比赛结束前最后一天售后群发布无水印可视化结果+无标注代码【可直接提交】为了防止倒卖， 论文写作过程中遗留数个致命问题，无关代码，该问题解决方式仅在官网授权售后群答疑，盗卖方式购买资料不提供答疑，感谢理解2024年研赛资料助攻购买链接+说明https://docs.qq.com/doc/p/e03d6bffc00b392932b7dc1fbcf746ef9b086a8a
# 目标函数
def objective(x):
    return w1 * model.predict([x]) + w2 * (-x[2] * x[4])  # x[2] 是频率, x[4] 是 Bm

# 优化变量
bounds = [(0, 3), (25, 90), (50000, 500000), (0, 3), (0, np.max(Bm))]
x0 = [1, 25, 100000, 1, 0.01]

# 优化
result = minimize(objective, x0, bounds=bounds)

# 输出优化结果
x_opt = result.x
optimal_transmission_energy = x_opt[2] * x_opt[4]
optimal_core_loss = model.predict([x_opt])

print(f'最优材料: 材料{round(x_opt[0])}')
print(f'最优温度: {x_opt[1]:.2f}摄氏度')
print(f'最优频率: {x_opt[2]:.2f}Hz')
print(f'最优波形类型: 波形{round(x_opt[3])}')
print(f'最优磁通密度峰值: {x_opt[4]:.4f}T')
print(f'最优传输磁能: {optimal_transmission_energy:.4f}')#比赛结束前最后一天售后群发布无水印可视化结果+无标注代码【可直接提交】为了防止倒卖， 论文写作过程中遗留数个致命问题，无关代码，该问题解决方式仅在官网授权售后群答疑，盗卖方式购买资料不提供答疑，感谢理解2024年研赛资料助攻购买链接+说明https://docs.qq.com/doc/p/e03d6bffc00b392932b7dc1fbcf746ef9b086a8a
print(f'最小磁芯损耗: {optimal_core_loss[0]:.4f}W/m^3')

# 可视化
plt.figure(figsize=(12, 6))

# 子图1：磁芯损耗变化情况
plt.subplot(1, 2, 1)
plt.plot(core_loss, 'r-', linewidth=1.5)
plt.xlabel('样本编号')
plt.ylabel('磁芯损耗 (W/m^3)')
plt.title('磁芯损耗变化')
plt.grid()

# 子图2：传输磁能变化情况
plt.subplot(1, 2, 2)
plt.plot(transmission_energy_values, 'b-', linewidth=1.5)
plt.xlabel('样本编号')
plt.ylabel('传输磁能')
plt.title('传输磁能变化')
plt.grid()

plt.tight_layout()
plt.show()
